/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.dao.impl;

import br.com.ecommerce.dao.HistoricoAtendimentoDAO;
import br.com.ecommerce.dao.pojo.EntityPojo;
import br.com.ecommerce.dao.pojo.HistoricoAtendimento;
import br.com.ecommerce.exceptions.DatabaseException;
import br.com.ecommerce.exceptions.IdInvalidoException;
import br.com.ecommerce.exceptions.ObjetoInvalidoException;
import br.com.ecommerce.factory.DatabaseFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Classe que implementa os métodos que manipulam a entidade HistoricoAtendimento
 * @author Afonso
 */
public class HistoricoAtendimentoDAOImpl implements HistoricoAtendimentoDAO {

    @Override
    public EntityPojo readByIdCliente(Integer idCliente)
                    throws IdInvalidoException, DatabaseException {
        if (idCliente == null) {
           throw new IdInvalidoException("ID inválido");

        }

        HistoricoAtendimento histAtendimento = new HistoricoAtendimento();
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        try {
            sql = "SELECT * FROM HISTORICO_ATENDIMENTO "
                    + "WHERE ID_CLIENTE="+idCliente;

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
                histAtendimento.setIdPrimaryKey(rs.getInt(1));
                histAtendimento.setIdCliente(idCliente);
                histAtendimento.setDescricao(rs.getString(3));
                histAtendimento.setSituacao(rs.getInt(4));

            } else {
                 throw new DatabaseException("Não há dados na base de dados para"
                         + " a query: " + sql);

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return histAtendimento;
    }

    @Override
    public void create(EntityPojo obj) throws ObjetoInvalidoException,
                                                    DatabaseException {
        if (obj == null || !(obj instanceof HistoricoAtendimento)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou "
                   + "não é do tipo HistoricoAtendimento");
        }

        HistoricoAtendimento histAtendimento = (HistoricoAtendimento)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        try {
            sql = "insert into HISTORICO_ATENDIMENTO values "
                    + "(HIST_ATENDIMENTO_SEQ.nextval, " +
                    "'" + histAtendimento.getIdCliente() + "', " +
                    "'" + histAtendimento.getDescricao() + "',"
                    + histAtendimento.getSituacao() + ")";

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            stmt.execute(sql);

            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public EntityPojo readById(Integer idPrimaryKey) throws IdInvalidoException,
                                                            DatabaseException {
        if (idPrimaryKey == null) {
           throw new IdInvalidoException("ID inválido");

        }

        HistoricoAtendimento histAtendimento = new HistoricoAtendimento();
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        try {
            sql = "SELECT * FROM HISTORICO_ATENDIMENTO "
                    + "WHERE ID_ATENDIMENTO="+idPrimaryKey;

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
                histAtendimento.setIdPrimaryKey(idPrimaryKey);
                histAtendimento.setIdCliente(rs.getInt(2));
                histAtendimento.setDescricao(rs.getString(3));
                histAtendimento.setSituacao(rs.getInt(4));

            } else {
                 throw new DatabaseException("Não há dados na base de dados para"
                         + " a query: " + sql);

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return histAtendimento;
    }

    @Override
    public List readAll() throws DatabaseException {
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        List<HistoricoAtendimento> list = new ArrayList<HistoricoAtendimento>();
        try {
            sql = "SELECT * FROM HISTORICO_ATENDIMENTO ORDER BY ID_ATENDIMENTO";

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                HistoricoAtendimento histAtendimento = new HistoricoAtendimento();
                histAtendimento.setIdPrimaryKey(rs.getInt(1));
                histAtendimento.setIdCliente(rs.getInt(2));
                histAtendimento.setDescricao(rs.getString(3));
                histAtendimento.setSituacao(rs.getInt(4));


              //  Logger.getLogger(ProdutoDAOImpl.class.getName())
              //              .log(Level.INFO, "String SQL : " + produto.toString());

                list.add(histAtendimento);
            }


            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return list;
    }

    /**
     * Para entidades que não podem ter seus registros excluídos, o campo
     * situacao é alterado para o valor 0, indicando que o registro está
     * desativado
     * @param idPrimaryKey
     * @throws IdInvalidoException
     * @throws DatabaseException
     */
    @Override
    public void deleteById(Integer idPrimaryKey) throws IdInvalidoException,
            DatabaseException {
        if (idPrimaryKey == null) {
           throw new IdInvalidoException("ID inválido");

        }

        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        try {
            sql = "UPDATE HISTORICO_ATENDIMENTO SET SITUACAO=0 "
                    + "WHERE ID_ATENDIMENTO='" + idPrimaryKey+"'";

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            stmt.execute(sql);

            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public void update(EntityPojo obj) throws ObjetoInvalidoException, DatabaseException {
        if (obj == null || !(obj instanceof HistoricoAtendimento)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou "
                   + "não é do tipo HistoricoAtendimento");
        }

        HistoricoAtendimento histAtendimento = (HistoricoAtendimento)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        try {
            sql = "UPDATE HISTORICO_ATENDIMENTO SET ID_CLIENTE='" +
                    histAtendimento.getIdCliente() + "', "
                    + "DESCRICAO='" + histAtendimento.getDescricao() + "', "
                    + "SITUACAO=" + histAtendimento.getSituacao()
                    + " WHERE ID_ATENDIMENTO = " + histAtendimento.getIdPrimaryKey();

            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            stmt.execute(sql);

            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(HistoricoAtendimentoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

}
